'use strict';

const rule = {
  email: () => /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,6}$/,
  phone: () => /^1\d{10}$/,
  url: () => /^(ht|f)tp(s?)\:\/\/.+$/,
  chinese: () => /^[\u4e00-\u9fa5]+$/,
  english: () => /^[a-zA-Z]+$/,
  number: () => /^(\d)+(\.\d+)?$/,
  empty: () => /^\s+$/,
  int: () => /^\d+$/,
  float: () => /^\d*\.\d+$/,
};
// 内容空校验
const _empty = function(val) {
  return !!((!val || rule.empty().test(val) || (Array.isArray(val) && val.length === 0) || (typeof val === 'object' && JSON.stringify(val) === '{}')));
};
// 内容长度检验
const _rangelength = function(val, len) {
  let min,
    max;
  if (Array.isArray(len) && len.length >= 2) {
    min = Number(len[0]);
    max = Number(len[1]);
  } else if (rule.int(len)) {
    min = 0;
    max = len;
  } else {
    return false;
  }
  if (val.length >= min && val.length <= max) {
    return true;
  }
  return false;
};

class validate {
  constructor(value) {
    this.value = value;
  }
  // 校验邮箱
  email() {
    return rule.email().test(this.value);
  }
  // 手机号
  phone() {
    return rule.phone().test(this.value);
  }
  // url
  url() {
    return rule.url().test(this.value);
  }
  // 中文字符
  chinese() {
    return rule.chinese().test(this.value);
  }
  // 英文字符
  english() {
    return rule.english().test(this.value);
  }
  // 空
  empty() {
    return _empty(this.value);
  }
  // 数字
  number() {
    return rule.number().test(this.value);
  }
  // 整数
  int() {
    return rule.int().test(this.value);
  }
  // 浮点
  float() {
    return rule.floor().test(this.value);
  }
  // 长度
  length(len) {
    return _rangelength(this.value, len);
  }
  // 有值字符串
  hasString() {
    return typeof this.value === 'string' && this.value;
  }
  // 有值数组
  hasArray() {
    return Array.isArray(this.value) && this.value.length;
  }
}

module.exports = validate;
